// 权限拦截在路由跳转  导航守卫
// 引入router，无须导出，因为mian.js引入了，只需要代码执行即可
import router from '@/router' // 引入路由实例
import store from '@/store' // 引入vuex store实例 --获取token
import NProgress from 'nprogress' // 引入一份进度条插件
import 'nprogress/nprogress.css' // 引入进度条样式

const whiteList = ['/login', '/404', '/register']
// next 是前置守卫必须执行的钩子，next必须执行，如果不执行，页面就死了
router.beforeEach(async(to, form, next) => {
  if (store.state.user.token) {
    // 如果有判断是登入页还是注册页，如果是跳转主页 不是直接放行
    if (to.path === '/login' || to.path === '/register') {
      next('/')
    } else {
      // 当存在token 且 不是登入页或注册页 需要获取用户详细信息
      // 条件:用户id存在
      if (!store.state.user.userInfo.id) {
        await store.dispatch('user/getUserInfo')
        const newRoutes = await store.dispatch('permission/filterRoutes', store.state.user.userInfo.menus)
        router.addRoutes([...newRoutes, { path: '*', redirect: '/404', hidden: true }])
        next(to.path)
      }
      next()
    }
  } else {
    // 如果没有token，判断是否是白名单
    if (whiteList.indexOf(to.path) > -1) {
      // 如果是白名单 直接跳转
      next()
    } else {
      // 否则跳转登入页
      next('/login')
    }
  }
  NProgress.done() // 手动强制关闭一次  为了解决 手动切换地址时  进度条的不关闭的问题
})

// 后置守卫
router.afterEach(function() {
  NProgress.done() // 关闭进度条
})

